package org.epsi.blokus.joueur;

import java.util.concurrent.Semaphore;
import org.epsi.blokus.entity.Board;
import org.epsi.blokus.tools.IConstantes;
import org.epsi.blokus.tools.IConstantes.TTypePiece;
import org.epsi.blokus.tools.Log;

/**
 * Joueur générique
 * @author julien.lafont
 */
public abstract class Player implements IConstantes {

    // Informations textuelles du joueur
    protected TTypePiece couleur;
    protected String pseudo;
    protected String avatar;
    protected AVATAR_T_ETATS avatarEtat;
    protected Boolean itsMe;

    protected long timeleft;
    protected INGAME_STATES state;

    // Plateau de jeu
    protected Board board;

    // Sémaphores de synchronisation
    protected Semaphore semTourDeJeu;
    protected Semaphore semInitialisationJoueur;

    
    public Player(TTypePiece couleur, boolean itsme) {
        this.couleur = couleur;
        this.avatarEtat = AVATAR_T_ETATS.Neutral;
        this.timeleft = GAME_LIMIT_TIME_S * 1000;
        this.state = INGAME_STATES.Init;
        this.itsMe = itsme;

        this.semTourDeJeu = new Semaphore(0, true);
        this.semInitialisationJoueur = new Semaphore(0, true);
    }

    //????
    public void isReady(String pseudo, String selectedAvatar)
    {
        this.pseudo = pseudo;
        this.avatar = selectedAvatar;
    }

    /**
     * Le joueur a gagné
     */
    public void changeBehaviorWin()
    {
        this.state = INGAME_STATES.Win;
        this.avatarEtat = AVATAR_T_ETATS.Happy;
    }

    /**
     * Le joueur a perdu
     */
    public void changeBehaviorLoose()
    {
        this.state = INGAME_STATES.Losse;
        this.avatarEtat = AVATAR_T_ETATS.Bummed;
    }

   /**
   * C'est à ce joueur de jouer
   */
    public void notifierTourDeJeu()
    {
        this.state = INGAME_STATES.Play;
        this.avatarEtat = AVATAR_T_ETATS.Thinking;
    }

    /**
     * Le joueur a fini de jouer
     */
    public void notifierFinTourDeJeu()
    {
        this.state = INGAME_STATES.Waiting;
        this.avatarEtat = AVATAR_T_ETATS.Neutral;

        // Est-ce que ce coup a été victorieux ?
        if (this.board.checkWin(couleur))
        {
            Log.out(pseudo+" a gagné !");
            this.changeBehaviorWin();
        }
    }

    
    


    public void decreaseTimeLeft(long delta)
    {
        timeleft-=delta;
    }
    
    public TTypePiece getCouleur()
    {
        return this.couleur;
    }

    public String getAvatar() {
        return avatar;
    }

    public AVATAR_T_ETATS getAvatarEtat() {
        return avatarEtat;
    }

    public String getPseudo() {
        return pseudo;
    }

    public long getTimeleft() {
        return timeleft;
    }

    public INGAME_STATES getState() {
        return state;
    }

    public Semaphore getSemInitialisationJoueur() {
        return semInitialisationJoueur;
    }

    public Boolean itsMe() {
        return itsMe;
    }

    public Board getBoard() {
        return board;
    }

    public Semaphore getSemaphoreTourDeJeu() {
        return semTourDeJeu;
    }

    public boolean isPlaying()
    {
        return this.state == INGAME_STATES.Play;
    }

    public boolean isWaiting()
    {
        return this.state == INGAME_STATES.Waiting;
    }

    public boolean isWinner()
    {
        return this.state == INGAME_STATES.Win;
    }

    public boolean isTimeOut()
    {
        return timeleft<0;
    }

    
    
    

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public void setAvatarEtat(AVATAR_T_ETATS etat) {
        this.avatarEtat = etat;
    }

    public void setPseudo(String pseudo) {
        this.pseudo = pseudo;
    }

    public void setInGameState(INGAME_STATES state) {
        this.state = state;
    }

    public void setBoard(Board board) {
        this.board = board;
    }



    




    
    

}
